package com.yxinsur.imc.business.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yxinsur.imc.business.domain.ImcRenewalRecn;
import com.yxinsur.imc.business.domain.ImcRenewalRecnDetails;
import com.yxinsur.imc.business.domain.ImcRenewalRecnSupplierDetails;
import com.yxinsur.imc.business.vo.RecnDetailsVo;
import com.yxinsur.imc.business.vo.RenewalRecnDetailsCheckVo;
import com.yxinsur.imc.business.vo.RenewalRecnVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 续年手续费对账单 Mapper接口
 *
 * @author imc
 * @date 2021-05-25
 */
@Mapper
public interface ImcRenewalRecnMapper extends BaseMapper<ImcRenewalRecn> {
    /**
     * 主表：新增主表
     *
     * @param imcRenewalRecn 主表
     * @return 结果
     */
    int insertImcRenewalRecn(ImcRenewalRecn imcRenewalRecn);

    /**
     * 主表：更新主表
     *
     * @param imcRenewalRecn 主表
     * @return 结果
     */
    int updateImcRenewalRecn(ImcRenewalRecn imcRenewalRecn);

    /**
     * 主表：根据{主表ID}查询主表
     *
     * @param id 主表ID
     * @return 结果
     */
    ImcRenewalRecn getImcRenewalRecnById(@Param("id") Long id);

    /**
     * 主表：查询主表列表
     *
     * @param settleMonth 选择月度
     * @param supplierId  供应商ID
     * @param tenantId    租户ID
     * @return 续年手续费对账单列表
     */
    List<RenewalRecnVo> listRenewalRecnList(@Param("settleMonth") String settleMonth, @Param("supplierId") Long supplierId, @Param("tenantId") Long tenantId);

    /**
     * L表：根据{主表ID}查询L表（domain）
     *
     * @param recnId   主表ID
     * @param tenantId 租户ID
     * @return 结果
     */
    List<ImcRenewalRecnDetails> listRenewalRecnDetailsByRecnId(@Param("recnId") Long recnId, @Param("tenantId") Long tenantId);

    /**
     * L表：根据{S表ID}查询L表（domain）
     *
     * @param recnSupplierDetailsId S表ID
     * @param tenantId              租户ID
     * @return 结果
     */
    List<ImcRenewalRecnDetails> listRenewalRecnDetailsByRecnSupplierDetailsId(@Param("recnSupplierDetailsId") Long recnSupplierDetailsId, @Param("tenantId") Long tenantId);

    /**
     * L表：根据{主表ID}查询L表（vo）
     *
     * @param recnId   主表ID
     * @param tenantId 租户ID
     * @return List<RecnDetailsVo>
     */
    List<RecnDetailsVo> listRenewalRecnDetailsVoByRecnId(@Param("recnId") Long recnId, @Param("tenantId") Long tenantId);

    /**
     * L表：批量更新L表
     *
     * @param recnDetailsList L表集合
     * @return int
     */
    int updateBatchOfDetails(@Param("list") List<ImcRenewalRecnDetails> recnDetailsList);

    /**
     * L表：批量写入L表
     *
     * @param lList L表集合
     * @return 结果
     */
    long insertRenewalRecnDetails(@Param("list") List<ImcRenewalRecnDetails> lList);

    /**
     * L表：批量更新L表（核对结果）
     *
     * @param recnDetailsVoList L表核对结果集合
     * @return 结果
     */
    long updateDetailsListOfCheckResult(@Param("list") List<RecnDetailsVo> recnDetailsVoList);

    /**
     * S表：根据{主表ID}查询S表（domain）
     *
     * @param recnId   主表ID
     * @param tenantId 租户ID
     * @return List<ImcRenewalRecnSupplierDetails>
     */
    List<ImcRenewalRecnSupplierDetails> listSupplierDetailsByRecnId(@Param("recnId") Long recnId, @Param("tenantId") Long tenantId);

    /**
     * S表：根据{主表ID}查询S表（vo）
     *
     * @param recnId   主表ID
     * @param tenantId 租户ID
     * @return List<RecnDetailsVo>
     */
    List<RecnDetailsVo> selectRenewalRecnDetailsVoByRecnId(@Param("recnId") Long recnId, @Param("tenantId") Long tenantId);

    /**
     * S表：根据{S表ID}查询S表
     *
     * @param id S表ID
     * @return ImcRecnSupplierDetails
     */
    ImcRenewalRecnSupplierDetails getImcRenewalRecnSupplierDetailsById(@Param("id") Long id);

    /**
     * S表：根据{主表ID}查询S表（COUNT）
     *
     * @param recnId          主表ID
     * @param recnCheckResult 核对结果
     * @param tenantId        租户ID
     * @return 结果
     */
    long countOfSupplierDetailsByRecnId(@Param("recnId") Long recnId, @Param("recnCheckResult") String recnCheckResult, @Param("tenantId") Long tenantId);

    /**
     * S表：写入S表
     *
     * @param imcRenewalRecnSupplierDetails S表
     * @return 结果
     */
    int insertRenewalRecnSupplierDetails(ImcRenewalRecnSupplierDetails imcRenewalRecnSupplierDetails);

    /**
     * S表：批量更新S表（核对结果）
     *
     * @param recnDetailsVoList S表核对结果集合
     * @return 结果
     */
    int updateSupplierDetailsListOfCheckResult(@Param("list") List<RecnDetailsVo> recnDetailsVoList);

    /**
     * S表：批量更新S表
     *
     * @param imcRenewalRecnSupplierDetailsList S表集合
     * @return 结果
     */
    int updateBatchOfSupplierDetails(@Param("list") List<ImcRenewalRecnSupplierDetails> imcRenewalRecnSupplierDetailsList);

    /**
     * S表：批量删除S表
     *
     * @param sList S表集合
     * @return 结果
     */
    int updateSupplierDetailsListOfDelete(@Param("list") List<ImcRenewalRecnSupplierDetails> sList);

    /**
     * 查询续年核对结果列表（平账与短账）
     *
     * @param recnId   主表ID
     * @param tenantId 租户ID
     * @return 核对结果列表
     */
    List<RenewalRecnDetailsCheckVo> listCheckOfLsSuccessAndLs(@Param("recnId") Long recnId, @Param("tenantId") Long tenantId);

    /**
     * 查询续年核对结果列表（长账）
     *
     * @param recnId   主表ID
     * @param tenantId 租户ID
     * @return 核对结果列表
     */
    List<RenewalRecnDetailsCheckVo> listCheckOfSL(@Param("recnId") Long recnId, @Param("tenantId") Long tenantId);

    /**
     * 根据{协议费用科目ID}查询协议是否被主表使用
     *
     * @param contractExpenseId 协议费用科目ID
     * @param tenantId          租户ID
     * @return 结果
     */
    long countOfRenewalRecnByContractExpenseId(@Param("contractExpenseId") Long contractExpenseId, @Param("tenantId") Long tenantId);
}
